
// import md5Libs from "uview-ui/libs/function/md5";
// import zip from 'common/jszip.min.js'
/**
 * 页面返回
 * @param {Object} num 返回页面数量
 */
const back = (num = 1) => {
	if (getCurrentPages().length == 1) {
		on('/pages/index/index')
	} else {
		uni.navigateBack({
			delta: num
		});
	}
}
/**
 * 页面重定向返回
 * @param {Object} num 返回页面数量
 */
const redirect = (url) => {
	uni.redirectTo({
		url: url
	});
}
/**
 * 页面跳转
 * 
 * @param {Object} url 需要跳转的应用内非 tabBar 的页面的路径
 * @param {Object} animationType 窗口显示的动画效果
 * @param {Object} animationDuration 窗口动画持续时间，单位为 ms
 */
const to = (url, animationType = 'pop-in', animationDuration = 300) => {
	uni.navigateTo({
		url,
		animationType,
		animationDuration,
		success: function(res) {
			console.log(res)
		},
		fail: function(e) {
			console.log(e)
		}
	})
}
/**
 * 打开任意链接
 * @param {Object} url 页面地址
 */
const on = (url) => {

	url = decodeURIComponent(url);

	//外部地址
	if (/^(\/\/)+/.test(url)) {

		// #ifdef H5
		window.location.href = url
		// #endif
		// #ifndef H5
		to('/pages/common/webview?url=http:' + url);

		//#endif
	} else if (/^(http|https):\/\/.+/.test(url)) {
		// #ifdef H5
		window.location.href = url
		// #endif
		// #ifndef H5
		//跳转外部地址
		to('/pages/common/webview?url=' + url);
		// #endif
	} else {

		//内部地址

		// 关闭所有页面，跳转链接
		if (url == '/pages/index/index' || url == '/pages/msg/msg' || url ==
			'/pages/ucenter/index' || url == '/pages/category/index') {
			uni.switchTab({
				url: url
			});
		} else {
			to(url);
		}
	}


}
/**
 * 提示信息
 * 
 * @param {Object} title 提示标题
 * @param {Object} duration 提示时间
 * @param {Object} mask 遮罩层
 * @param {Object} icon 图标层
 */
const msg = (title, duration = 1500, mask = false, icon = 'error') => {
	//统一提示方便全局修改
	if (Boolean(title) === false) {
		return;
	}
	// #ifdef APP-PLUS
	icon = 'none'
	// #endif
	uni.showToast({
		title,
		duration,
		mask,
		icon
	});

}


/**
 * 拨打电话
 * @param {JSON} number 电话号码
 */
const phone = (number) => {
	uni.makePhoneCall({
		phoneNumber: number //仅为示例
	});
}

/**
 * 获取系统信息
 */
const sys = () => {
	let sys = uni.getSystemInfoSync();
	let data = {
		top: sys.statusBarHeight,
		height: sys.statusBarHeight + uni.upx2px(90),
		screenHeight: sys.screenHeight,
		platform: sys.platform,
		model: sys.model,
		windowHeight: sys.windowHeight,
		windowBottom: sys.windowBottom
	};
	// #ifndef MP
	data.height = sys.statusBarHeight + uni.upx2px(90);
	// #endif
	// #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO || MP-WEIXIN
	let custom = uni.getMenuButtonBoundingClientRect();
	data.height = custom.bottom + custom.top - sys.statusBarHeight;
	// #endif		
	// #ifdef MP-ALIPAY
	data.height = sys.statusBarHeight + sys.titleBarHeight;
	// #endif
	return data;
}


/**
 * 拼接图片地址
 */
const img = (url) => {
	// let image = '';
	// //当地址不存在
	// if (url) {
	// 	if ((/^data:image\//.test(url))) {
	// 		image = url;
	// 	} else if ((/^(http|https):\/\/.+/.test(url))) {
	// 		image = url;
	// 	} else {
	// 		image = config.cdnurl + url;
	// 	}
	// } else {
	// 	image = config.cdnurl + '/static/common/no_img.png';
	// }
	// return image;
}

/**
 * 获取地址参数
 */
const getUrlQuery = (variable, url) => {

	if (!url) {
		url = window.location.href
	}

	let query = url.split('?');
	if (query.length > 1) {
		query = query[1];
	} else {
		return (false);
	}
	let vars = query.split("&");
	for (let i = 0; i < vars.length; i++) {
		let pair = vars[i].split("=");
		if (pair[0] == variable) {
			return pair[1];
		}
	}
	return (false);
}




/**
 * 时间格式化
 * @param String timestamp 时间戳
 * @param String fmt 返回的时间格式
 * yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合
 */
const timeFormat = (timestamp = null, fmt = 'yyyy-mm-dd') => {
	// 其他更多是格式化有如下:
	// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合

	//已经格式化时间戳
	if (parseInt(timestamp) < 1000000000) {
		return timestamp;
	}

	timestamp = parseInt(timestamp);

	// 如果为null,则格式化当前时间
	if (!timestamp) timestamp = Number(new Date());
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000;
	let date = new Date(timestamp);
	let ret;
	let opt = {
		"y+": date.getFullYear().toString(), // 年
		"m+": (date.getMonth() + 1).toString(), // 月
		"d+": date.getDate().toString(), // 日
		"h+": date.getHours().toString(), // 时
		"M+": date.getMinutes().toString(), // 分
		"s+": date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	};
	for (let k in opt) {
		ret = new RegExp("(" + k + ")").exec(fmt);
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
		};
	};
	return fmt;
}

const timeSub = (startTime, end) => {

	//    let startTime = new Date().getTime();
	// console.log("startTime:"+startTime)
	//    // let startTime = new Date(); //当前时间

	//    let end = new Date(time).getTime(); //结束时间
	// console.log("end:"+end)
	// console.log(end)
	let result = parseInt((end - startTime) / 1000); //计算出豪秒
	let d = parseInt(result / (24 * 60 * 60)); //用总共的秒数除以1天的秒数
	let h = parseInt((result / (60 * 60)) % 24); //精确小时，用去余
	let m = parseInt((result / 60) % 60); //剩余分钟就是用1小时等于60分钟进行趣余
	let s = parseInt(result % 60);
	//统一格式的显示
	d < 10 ? d = '0' + d : d;
	h < 10 ? h = '0' + h : h;
	m < 10 ? m = '0' + m : m;
	s < 10 ? s = '0' + s : s;
	//当倒计时结束时，改变内容
	if (result <= 0) {
		return "-";
	}
	if (d == '00' && h == '00' && m == '00') {
		return s + "秒";;
	}
	if (d == '00' && h == '00') {
		return m + "分" + s + "秒";;
	}
	if (d == '00') {
		return h + "时" + m + "分" + s + "秒";;
	}


	return d + "天" + h + "时" + m + "分" + s + "秒";
}


/**
 * 社交时间友好
 * @param String timestamp 时间戳
 * @param String | Boolean format 如果为时间格式字符串，超出一定时间范围，返回固定的时间格式；
 * 如果为布尔值false，无论什么时间，都返回多久以前的格式
 */
const timeToDate = (timestamp = null, format = 'yyyy-mm-dd') => {
	if (timestamp == null) timestamp = Number(new Date());
	timestamp = parseInt(timestamp);
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000;
	var timer = (new Date()).getTime() - timestamp;
	timer = parseInt(timer / 1000);
	// 如果小于5分钟,则返回"刚刚",其他以此类推
	let tips = '';
	switch (true) {
		case timer < 300:
			tips = '刚刚';
			break;
		case timer >= 300 && timer < 3600:
			tips = parseInt(timer / 60) + '分钟前';
			break;
		case timer >= 3600 && timer < 86400:
			tips = parseInt(timer / 3600) + '小时前';
			break;
		case timer >= 86400 && timer < 2592000:
			tips = parseInt(timer / 86400) + '天前';
			break;
		default:
			// 如果format为false，则无论什么时间戳，都显示xx之前
			if (format === false) {
				if (timer >= 2592000 && timer < 365 * 86400) {
					tips = parseInt(timer / (86400 * 30)) + '个月前';
				} else {
					tips = parseInt(timer / (86400 * 365)) + '年前';
				}
			} else {
				tips = timeFormat(timestamp, format);
			}
	}
	return tips;
}

/**
 * IM时间友好
 * @param String timestamp 时间戳
 * @param String | Boolean format 如果为时间格式字符串，超出一定时间范围，返回固定的时间格式；
 * 如果为布尔值false，无论什么时间，都返回多久以前的格式
 */
const timeToChat = (timestamp = null) => {
	if (timestamp == null) timestamp = Number(new Date());
	timestamp = parseInt(timestamp);
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000;
	var timer = (new Date()).getTime() - timestamp;
	timer = parseInt(timer / 1000);
	// 如果小于5分钟,则返回"刚刚",其他以此类推
	let tips = '';
	switch (true) {
		case timer < 86400:
			tips = timeFormat(timestamp, 'hh:MM');
			break;
		case timer >= 86400 && timer < 86400 * 7:
			var now = new Date(timestamp);
			var week = ['日', '一', '二', '三', '四', '五', '六'];
			switch (new Date().getDate() - now.getDate()) {
				case 1:
					tips = timeFormat(timestamp, '昨天 hh:MM');
					break;
				case 2:
					tips = timeFormat(timestamp, '前天 hh:MM');
					break;
				default:
					tips = '星期' + week[now.getDay()] + timeFormat(timestamp, 'hh:MM');
			}
			break;
		case timer >= 86400 * 7:
			tips = timeFormat(timestamp, 'mm-dd hh:MM');
			break;
		default:
			tips = timeFormat(timestamp, 'yyyy-mm-dd hh:MM');
	}
	return tips;
}


/**
 * 加法精度计算
 * @param {Object} number 数字
 */
const bcadd = (a, b) => {
	var c, d, e;


	if (typeof a == 'undefined') a = 0
	if (typeof b == 'undefined') b = 0



	try {
		c = a.toString().split(".")[1].length
	} catch (f) {
		c = 0
	}
	try {
		d = b.toString().split(".")[1].length
	} catch (f) {
		d = 0
	}
	return e = Math.pow(10, Math.max(c, d)), (bcmul(a, e) + bcmul(b, e)) / e
}

/**
 * 减法精度计算
 * @param {Object} number 数字
 */
const bcsub = (a, b) => {
	var c, d, e;
	if (typeof a == 'undefined') a = 0
	if (typeof b == 'undefined') b = 0


	try {
		if ((typeof a) == 'string') {
			c = a.split(".")[1].length
		} else {
			c = a.toString().split(".")[1].length
		}

	} catch (f) {
		c = 0
	}

	try {

		if ((typeof b) == 'string') {
			d = b.split(".")[1].length
		} else {
			d = b.toString().split(".")[1].length
		}
	} catch (f) {
		d = 0
	}
	return e = Math.pow(10, Math.max(c, d)), (bcmul(a, e) - bcmul(b, e)) / e
}

/**
 * 乘法精度计算
 * @param {Object} number 数字
 */
const bcmul = (a, b) => {
	if (typeof a == 'undefined') a = 0
	if (typeof b == 'undefined') b = 0


	var c = 0,
		d = (typeof a) == 'string' ? a : a.toString(),
		e = (typeof b) == 'string' ? b : b.toString();

	try {
		c += d.split(".")[1].length
	} catch (f) {}
	try {
		c += e.split(".")[1].length
	} catch (f) {}
	return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c)
}

/**
 * 除法精度计算
 * @param {Object} number 数字
 */
const bcdiv = (a, b) => {
	var c, d, e = 0,
		f = 0;
	if (typeof a == 'undefined') a = 0
	if (typeof b == 'undefined') b = 0

	try {
		e = a.toString().split(".")[1].length
	} catch (g) {}
	try {
		f = b.toString().split(".")[1].length
	} catch (g) {}
	return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), bcmul(c / d,
		Math.pow(10, f - e))
}

//浏览器类型
const browserType = (key) => {
	const u = navigator.userAgent;
	// 获取运行环境对象
	const versions = {
		trident: u.indexOf('Trident') > -1, //IE内核
		presto: u.indexOf('Presto') > -1, //opera内核
		webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
		gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
		mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
		ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
		android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端
		iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器
		iPad: u.indexOf('iPad') > -1, //是否iPad
		webApp: u.indexOf('Safari') == -1, //是否web应该程序，没有头部与底部
		weixin: u.indexOf('MicroMessenger') > -1, //是否微信 （2015-01-22新增）
		qq: u.match(/\sQQ/i) == ' qq' //是否QQ
	};
	return key ? versions[key] : versions;
}



//请求签名
const reqSign = () => {
	// let time = Math.round(new Date() / 1000).toString();
	// let key = md5Libs.md5('h5' + '18a3257675b85febdfcdd83e7150c0b9')
	// return md5Libs.md5(md5Libs.md5(key + time)) + time;
}

//解密数据
const decodeData = (data) => {

	 // let zlib = zip();
	// console.log(zip.Zlib);
	// console.log(zip.Zlib.InflateStream(new Buffer.from(data, 'base64')).toString('utf8'));
	return data;
}


const install = Vue => {
	Vue.prototype.$tools = {
		on,
		to,
		img,
		back,
		msg,
		redirect, //重定向
		sys, //系统信息
		getUrlQuery, //获取url参数
		timeFormat, //时间格式转换
		timeToDate, //时间转友好日期
		timeToChat, //时间转消息发送日期
		timeSub, //时间差

		browserType, //浏览器类型
		bcadd, //加法
		bcsub, //减法
		bcmul, //乘法
		bcdiv, //除法
		reqSign, //请求签名
		decodeData, //解密数据

	}

}

export default {
	install
}